/**
 * 日志模块
 * 提供不同级别的日志记录功能
 */

// 日志级别
const LogLevel = {
    DEBUG: 0,
    INFO: 1,
    WARN: 2,
    ERROR: 3,
    NONE: 4
};

// 日志配置
let config = {
    level: LogLevel.INFO, // 默认日志级别
    useColors: true, // 是否使用颜色
    prefix: '[LittleCook]', // 日志前缀
    showTimestamp: true, // 是否显示时间戳
    logToConsole: true // 只输出到控制台
};

/**
 * 格式化日志消息
 * @private
 * @param {string} level 日志级别
 * @param {string} message 日志消息
 * @param {Object} [data] 附加数据
 * @returns {string} 格式化后的日志消息
 */
function _formatMessage(level, message, data) {
    const timestamp = config.showTimestamp ? `[${new Date().toISOString()}]` : '';
    const prefix = config.prefix ? `${config.prefix}` : '';
    const levelStr = `[${level}]`;

    let dataStr = '';
    if (data !== undefined) {
        try {
            if (typeof data === 'string') {
                dataStr = data;
            } else {
                dataStr = JSON.stringify(data);
            }
        } catch (err) {
            dataStr = '[无法序列化的数据]';
        }
    }

    return `${timestamp}${prefix}${levelStr} ${message}${dataStr ? ' ' + dataStr : ''}`;
}

/**
 * 输出日志到控制台
 * @private
 * @param {string} level 日志级别
 * @param {string} formattedMessage 格式化后的日志消息
 */
function _logToConsole(level, formattedMessage) {
    if (!config.logToConsole) return;

    // 在Node.js环境中，使用console的不同方法
    if (typeof process !== 'undefined' && process.stdout) {
        switch (level) {
            case 'DEBUG':
                console.debug(formattedMessage);
                break;
            case 'INFO':
                console.info(formattedMessage);
                break;
            case 'WARN':
                console.warn(formattedMessage);
                break;
            case 'ERROR':
                console.error(formattedMessage);
                break;
            default:
                console.log(formattedMessage);
        }
    } else {
        // 在浏览器或小程序环境中
        // 根据级别选择不同的颜色
        if (config.useColors) {
            const styles = {
                DEBUG: 'color: #6c757d', // 灰色
                INFO: 'color: #0d6efd', // 蓝色 
                WARN: 'color: #ffc107', // 黄色
                ERROR: 'color: #dc3545' // 红色
            };

            console.log(`%c${formattedMessage}`, styles[level] || '');
        } else {
            console.log(formattedMessage);
        }
    }
}

/**
 * 记录日志
 * @private
 * @param {string} level 日志级别名称
 * @param {number} levelValue 日志级别值
 * @param {string} message 日志消息
 * @param {Object} [data] 附加数据
 */
function _log(level, levelValue, message, data) {
    // 检查日志级别
    if (levelValue < config.level) {
        return;
    }

    const formattedMessage = _formatMessage(level, message, data);

    // 输出到控制台
    _logToConsole(level, formattedMessage);
}

/**
 * 配置日志系统
 * @param {Object} newConfig 新的配置
 */
function configure(newConfig = {}) {
    config = { ...config, ...newConfig };
}

/**
 * 设置日志级别
 * @param {number} level 日志级别
 */
function setLevel(level) {
    if (typeof level === 'number' && level >= LogLevel.DEBUG && level <= LogLevel.NONE) {
        config.level = level;
    }
}

// 导出日志函数
module.exports = {
    // 日志级别常量
    LogLevel,

    // 配置函数
    configure,
    setLevel,

    // 日志函数
    debug: (message, data) => _log('DEBUG', LogLevel.DEBUG, message, data),
    info: (message, data) => _log('INFO', LogLevel.INFO, message, data),
    warn: (message, data) => _log('WARN', LogLevel.WARN, message, data),
    error: (message, data) => _log('ERROR', LogLevel.ERROR, message, data),

    // 获取当前配置
    getConfig: () => ({ ...config })
}; 